package com.bs.biaoge.util;

import cn.hutool.core.date.DateTime;
import com.sun.corba.se.spi.orbutil.threadpool.Work;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * @author 小姚
 * @pakeageName:com.bs.biaoge.util
 * @ClassName:ExcelUtil
 * @Descirption:
 * @data 2023/3/3 21:15
 */
//excel工具类
public class ExcelUtil {


    //返回workbook
    public static Workbook getWorkbook(InputStream input){
        Workbook sheets =null;
        try {
            sheets=WorkbookFactory.create(input);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        }
       return sheets;
    }


    //获取表格中的数据类型转换器
    //判断cell中存放的类型
    public static Object getCellType(Cell cell){
        CellType cellType =null;
        Object cellValue = "";
        if (cell != null) {
// 获取单元格的数据类型
            cellType=cell.getCellTypeEnum();

            switch (cellType) {
// 未知类型，用于表示初始化前的状态或缺少具体类型。仅供内部使用。
                case _NONE:
                    // System.out.print("未知类型");
                    break;
// 数值类型 小数，整数，日期
                case NUMERIC:
// 如果是数字类型，判断是不是日期类型
                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
// 获取单元格的值
                        Date dateCellValue = cell.getDateCellValue();
                        cellValue = new DateTime(dateCellValue).toString("yyyy-MM-dd");
                        // System.out.print("日期");
                    } else {
// 如果是小数，或者整数，防止数字过长，将其转成字符串进行
                        cell.setCellType(CellType.STRING);
                        cellValue = cell.toString();
                        // System.out.print("小数或整数转为字符串");
                    }
                    break;
// 字符串类型
                case STRING:
                    cellValue = cell.getStringCellValue();
                    //System.out.print("字符串");
                    break;
// 公式
                case FORMULA:
                    cellValue = cell.getCellFormula();
                    //System.out.print("公式");
                    break;
                case BLANK:
                    // System.out.print("空白的单元格");
                    break;
                case ERROR:
                    //System.out.print("错误类型");
                    break;
                case BOOLEAN:
                    cellValue = cell.getBooleanCellValue() + "";
                    //System.out.print("布尔类型");
            }
            //System.out.print("数据为：" + cellValue + " | ");
        }
        return cellValue;
    }

    //返回map<String,List<object[]>>
    public static Map<String, List<Object[]>> getExcelMap(InputStream stream){
        //获取workbook
        Workbook workbook = getWorkbook(stream);
        //获取一共有多少了工作薄
        int sheets = workbook.getNumberOfSheets();
        Map<String,List<Object[]>> map=new HashMap<>();
        for(int i=0;i<sheets;i++){
            //获取工作表
            Sheet sheet = workbook.getSheetAt(i);
            //获取开始行
            int firstRowNum = sheet.getFirstRowNum();
            //获取结束行
            int lastRowNum = sheet.getLastRowNum();
            List<Object[]> list=new ArrayList<>();
            Object[] objs=null;
            for(int j=firstRowNum;j<=lastRowNum;j++){
                //获取行
                Row row = sheet.getRow(j);
                //判断行是否为空
                if(row==null) {
                 continue;
                }

                    //获取行中的开始表格
                    short firstCellNum = row.getFirstCellNum();
                    short lastCellNum = row.getLastCellNum();
                    objs=new Object[lastCellNum];
                    for(int m=0;m<=lastRowNum;m++){
                        Cell cell = row.getCell(m);
                        if(cell==null || cell.equals("")){
                            continue;
                        }
                        objs[m]=getCellType(cell);
                    }
                    if(isTrue(objs)){
                        continue;
                    }
                    list.add(objs);

            }
            map.put(workbook.getSheetName(i).trim(),list);
        }
       return map;

    }

    public static boolean isTrue(Object[] objs){
        if(objs.length==0||objs==null){
            return true;
        }
        return false;
    }


}
